Exception Handling হলো প্রোগ্রামিংয়ে একটি গুরুত্বপূর্ণ ধারণা, যা একটি প্রোগ্রামে কোনো ত্রুটি (Error) বা ব্যতিক্রম (Exception) ঘটলে তা সঠিকভাবে পরিচালনা করতে সাহায্য করে। রুবি ভাষায়, ত্রুটির কারণে প্রোগ্রামটি ক্র্যাশ না হয়ে সঠিকভাবে কাজ করতে exception handling ব্যবহৃত হয়। এর মাধ্যমে প্রোগ্রামটি চলাকালে যেকোনো ধরনের অপ্রত্যাশিত ত্রুটি ধরা এবং সেগুলোর সাথে সঠিকভাবে ব্যবস্থা নেয়া সম্ভব হয়।
Exception Handling এর কাঠামো
রুবিতে exception handling করার জন্য begin, rescue, ensure, এবং else ব্লক ব্যবহার করা হয়।
1. begin Block:
এই ব্লকটি দিয়ে আপনি সেই কোড লেখেন যা আপনি রান করাতে চান এবং সেখানে যদি কোনো exception (ত্রুটি) ঘটতে পারে, তবে সেটি ক্যাচ করার জন্য প্রস্তুত থাকেন।
2. rescue Block:
যখন একটি exception ঘটে, তখন rescue ব্লকটি তা হ্যান্ডল করে। এখানে আপনি নির্দিষ্ট exception টাইপগুলো ক্যাচ করে প্রয়োজনীয় ব্যবস্থা নিতে পারেন।
3. ensure Block:
ensure ব্লকটি ত্রুটি ঘটুক বা না ঘটুক, এটি সবসময় এক্সিকিউট হবে। এটি মূলত সেই কোডকে রাখতে ব্যবহৃত হয়, যা শেষের দিকে অবশ্যই চলবে (যেমন ফাইল বন্ধ করা, সংস্থান মুক্ত করা ইত্যাদি)।
4. else Block:
else ব্লকটি শুধুমাত্র তখন এক্সিকিউট হবে, যখন begin ব্লকে কোনো ত্রুটি (exception) ঘটবে না।
Exception Handling এর Syntax
begin
# কোড যা আপনি রান করতে চান
rescue SomeError => e
# ত্রুটি হলে কী করতে হবে
else
# কোনো ত্রুটি না হলে এটি এক্সিকিউট হবে
ensure
# সবসময় এই কোড এক্সিকিউট হবে
endException Handling উদাহরণ
১. Basic Example (বেসিক উদাহরণ)
begin
# এমন কোড যা ত্রুটি ঘটাতে পারে
num = 10 / 0 # ডিভিশন বাই জিরো
rescue ZeroDivisionError => e
# ত্রুটি হলে এই ব্লকটি কার্যকর হবে
puts "Error: #{e.message}"
endএখানে, 10 / 0 ত্রুটি ঘটাবে কারণ শূন্য দিয়ে ভাগ করা যাবে না। এই exception ZeroDivisionError ক্যাচ করা হবে এবং একটি ত্রুটি মেসেজ দেখানো হবে।
আউটপুট:
Error: divided by 0২. Multiple Exceptions (একাধিক Exception হ্যান্ডলিং)
রুবি আপনাকে একাধিক exception টাইপ হ্যান্ডল করতে দেয়। একাধিক rescue ব্লক ব্যবহার করা যায়।
begin
num = 10 / 0 # প্রথম ত্রুটি
arr = [1, 2, 3]
arr.fetch(5) # দ্বিতীয় ত্রুটি
rescue ZeroDivisionError => e
puts "Error: #{e.message}" # 'ZeroDivisionError' হ্যান্ডল
rescue IndexError => e
puts "Error: #{e.message}" # 'IndexError' হ্যান্ডল
endআউটপুট:
Error: divided by 0এখানে প্রথমে ZeroDivisionError ত্রুটি ঘটবে এবং তা হ্যান্ডল করা হবে।
৩. else ব্লক ব্যবহার (When No Exception Occurs)
যখন begin ব্লকটি কোনো ত্রুটি ছাড়াই এক্সিকিউট হয়, তখন else ব্লকটি কাজ করবে।
begin
puts "This is a safe operation."
rescue => e
puts "Error: #{e.message}"
else
puts "No errors occurred."
ensure
puts "This code will always run."
endআউটপুট:
This is a safe operation.
No errors occurred.
This code will always run.এখানে, ত্রুটি না ঘটলে else ব্লক এক্সিকিউট হয়, এবং ensure ব্লক সবসময় চলবে।
৪. ensure ব্লক:
ensure ব্লকটি এমন কোড রাখার জন্য ব্যবহৃত হয়, যা প্রোগ্রাম যেকোনো অবস্থায় এক্সিকিউট করবে, যেমন ফাইল বা ডাটাবেস কানেকশন বন্ধ করা।
begin
# কোড যা ত্রুটি ঘটাতে পারে
file = File.open("example.txt", "w")
file.puts "Hello, World!"
rescue => e
puts "Error: #{e.message}"
ensure
file.close if file # ফাইল বন্ধ করা
puts "File has been closed."
endআউটপুট:
File has been closed.এখানে, ensure ব্লকটি নিশ্চিত করবে যে ফাইল বন্ধ হয়ে যাবে, যা ত্রুটি ঘটুক বা না ঘটুক।
Exception Types (ত্রুটির ধরণ)
রুবিতে বিভিন্ন ধরনের exception (ত্রুটি) রয়েছে। কিছু সাধারণ exception টাইপ হচ্ছে:
StandardError: সাধারণ ত্রুটি যা ক্লাসের অভ্যন্তরে ঘটে।ZeroDivisionError: শূন্য দিয়ে ভাগ করা হলে ঘটে।ArgumentError: ভুল আর্গুমেন্ট প্রদান করলে ঘটে।IndexError: অ্যারে বা তালিকা থেকে অবৈধ ইনডেক্সে অ্যাক্সেস করলে ঘটে।
রুবি ত্রুটি ধরতে rescue ব্লকের মধ্যে নির্দিষ্ট exception টাইপ উল্লেখ করা যায়, অথবা সমস্ত ত্রুটির জন্য rescue => e ব্যবহার করা যায়।
Custom Exception (কাস্টম exception)
রুবি আপনাকে আপনার নিজস্ব exception তৈরি করার সুযোগ দেয়, যা নির্দিষ্ট ধরনের ত্রুটির জন্য ব্যবহৃত হয়। আপনি একটি নতুন exception ক্লাস তৈরি করতে পারেন যা StandardError অথবা অন্য কোনো এক্সেপশন ক্লাস থেকে উত্তরাধিকার লাভ করবে।
class MyCustomError < StandardError
def initialize(msg="This is a custom error")
super(msg)
end
end
begin
raise MyCustomError.new("Something went wrong!")
rescue MyCustomError => e
puts "Caught custom error: #{e.message}"
endআউটপুট:
Caught custom error: Something went wrong!এখানে, MyCustomError একটি কাস্টম exception যা আমাদের নির্ধারিত মেসেজ দিয়ে রাইজ করা হয়েছে।
Conclusion (সারসংক্ষেপ)
- Exception Handling হল প্রোগ্রামে ত্রুটি বা ব্যতিক্রম ঘটলে সেগুলি সঠিকভাবে হ্যান্ডল করার প্রক্রিয়া।
- রুবিতে
begin,rescue,else,ensureব্লক ব্যবহার করে exception handling করা হয়। rescueব্লকের মাধ্যমে বিভিন্ন ধরনের exception ক্যাচ করা যায়।ensureব্লক সবসময় এক্সিকিউট হয়, এবং এটি সিস্টেম ক্লিনআপের জন্য ব্যবহৃত হয়।- কাস্টম exception তৈরি করার জন্য নিজস্ব exception ক্লাস তৈরি করা যায়।
Exception handling এর মাধ্যমে আপনি প্রোগ্রামের ত্রুটির সাথে নিরাপদভাবে কাজ করতে পারেন এবং ব্যবহারকারীর জন্য আরও উন্নত অভিজ্ঞতা তৈরি করতে পারেন।
Read more